/*

Simple sound recording

This example reads from the default PCM device
and writes to standard output for 5 seconds of data.

*/
/* Use the newer ALSA API */
#define ALSA_PCM_NEW_HW_PARAMS_API

#define SAMPLE_RATE 11025
#define PERIOD_SIZE 400 // numero de amostras do buffer
#define PERIOD_TIME 2   // tempo de gravacao

#include <alsa/asoundlib.h>
#include <stdio.h>
#include <stdlib.h>

int grava(char *buffer1) 
{
  long loops;
  int rc;
  int size;
  snd_pcm_t *handle;
  snd_pcm_hw_params_t *params;
  unsigned int val;
  int dir;
  snd_pcm_uframes_t frames;
  char *buffer;
  
  //FILE *fp;   /* file pointer */
  int time;
  int i,k;
    
  /* Erasing output file, if exists*/
  //remove("sound.raw");
   
  /* Open PCM device for recording (capture). */
  rc = snd_pcm_open(&handle, "default",
                    SND_PCM_STREAM_CAPTURE, 0);
  if (rc < 0) 
  {
    fprintf(stderr,"unable to open pcm device: %s\n",snd_strerror(rc));
    exit(1);
  }
  
  /* Allocate a hardware parameters object. */
  snd_pcm_hw_params_alloca(&params);

  /* Fill it in with default values. */
  snd_pcm_hw_params_any(handle, params);

  /* Set the desired hardware parameters. */

  /* Interleaved mode */
  snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED);

  /* Signed 16-bit little-endian format */
  snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE);

  /* number of channels */
  snd_pcm_hw_params_set_channels(handle, params, 1);

  /* Defining sampling rate */
  val = SAMPLE_RATE;
  snd_pcm_hw_params_set_rate_near(handle, params, &val, &dir);

  /* Set period size to 32 frames. */
  frames = PERIOD_SIZE;
  snd_pcm_hw_params_set_period_size_near(handle, params, &frames, &dir);

  /* Write the parameters to the driver */
  rc = snd_pcm_hw_params(handle, params);
  if (rc < 0) 
  {
    fprintf(stderr, "unable to set hw parameters: %s\n", snd_strerror(rc));
    exit(1);
  }

  /* Use a buffer large enough to hold one period */
  snd_pcm_hw_params_get_period_size(params, &frames, &dir);
  size = frames * 2; /* 2 bytes/sample, 1 channel */
  buffer = (char *) malloc(size);

  /* We want to loop for PERIOD_TIME seconds */
  snd_pcm_hw_params_get_period_time(params, &val, &dir);
  loops = (PERIOD_TIME*1000000) / val;
  k=0;
  for (time=0;time<loops;time++)
  {
    rc = snd_pcm_readi(handle, buffer, frames);
    if (rc == -EPIPE) 
    {
      /* EPIPE means overrun */
      fprintf(stderr, "overrun occurred\n");
      snd_pcm_prepare(handle);
    } 
    else if (rc < 0) 
    {
      fprintf(stderr,
              "error from read: %s\n", 
              snd_strerror(rc));
    } 
    else if (rc != (int)frames) 
    {
      fprintf(stderr, "short read, read %d frames\n", rc);
	
    }
    
    /* open file for output 
    if ((fp = fopen("sound.raw", "a+b"))==NULL)
    {
      printf("Cannot open file \n");
      exit(1);
    }

    if (fwrite(buffer, size, 1, fp) !=1)
    {
     printf("Write error occurred");
     exit(1);
    }
    
    fclose(fp);
    */
    for(i=0;i<size;i++)
    	buffer1[k++]=buffer[i];
    /*rc = write(1, buffer, size);
    if (rc != size)
      fprintf(stderr, 
              "short write: wrote %d bytes\n", rc);
    */
  }
  snd_pcm_drain(handle);
  snd_pcm_close(handle);
  free(buffer);

  return k; 	
}

